package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IAttendPunchRecordDAO;
import org.jsola.hr.dto.AttendPunchRecordAddDTO;
import org.jsola.hr.dto.AttendPunchRecordUpdateDTO;
import org.jsola.hr.dto.excel.AttendPunchRecordImportDTO;
import org.jsola.hr.entity.AttendPunchRecordDO;
import org.jsola.hr.query.AttendPunchRecordQuery;
import org.jsola.hr.vo.AttendPunchRecordListVO;
import org.jsola.hr.vo.AttendPunchRecordVO;
import org.jsola.hr.vo.excel.AttendanceSheetResultVO;
import org.jsola.hr.vo.excel.AttendPunchRecordExportVO;
import org.jsola.hr.vo.excel.ParseResultVO;
import org.jsola.user.core.TokenUser;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.List;
import java.util.Map;


/**
 * 考勤打卡记录
 *
 * @author zhr
 */
public interface IAttendPunchRecordService extends IService<IAttendPunchRecordDAO, AttendPunchRecordDO> {

    /**
     * 根据考勤计算工资
     * @param attendanceSheetResultVO 解析考勤表类
     * @param tokenUser 当前用户
     * @return 计算工资后结果
     */
    AttendanceSheetResultVO calculateSalaryByAttendPunch(AttendanceSheetResultVO attendanceSheetResultVO, TokenUser tokenUser);

    /**
     * 解析excel考勤表
     * @param file 上传的文件
     * @param startCol 需要识别的开始列数
     * @param endCol 需要识别的结束列数
     * @param nameCol 需要识别的人员名字列数
     * @param startRow 需要识别的开始行数
     * @param tokenUser 当前用户
     * @return 解析结果
     */
    AttendanceSheetResultVO parseExcelAttendanceSheet(MultipartFile file, TokenUser tokenUser,Integer startCol,Integer endCol,Integer nameCol,Integer startRow);

    /**
     * 新增考勤打卡记录
     * @param attendPunchRecordAddDTO 新增考勤打卡记录DTO
     * @param tokenUser 当前用户
     * @return 考勤打卡记录详情信息
     */
    AttendPunchRecordVO save(AttendPunchRecordAddDTO attendPunchRecordAddDTO, TokenUser tokenUser);

    /**
     * 批量新增考勤打卡记录
     * @param attendPunchRecordAddDTOList 新增考勤打卡记录DTO
     * @param tokenUser 当前用户
     * @return 考勤打卡记录详情信息
     */
    List<AttendPunchRecordVO> batchSave(List<AttendPunchRecordAddDTO> attendPunchRecordAddDTOList, TokenUser tokenUser);

    /**
     * 修改考勤打卡记录
     * @param attendPunchRecordUpdateDTO 修改考勤打卡记录DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(AttendPunchRecordUpdateDTO attendPunchRecordUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除考勤打卡记录，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param attendPunchRecordIds 考勤打卡记录id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...attendPunchRecordIds);

    /**
     * 根据考勤打卡记录id查找
     * @param attendPunchRecordId 考勤打卡记录id
     * @param siteId 所属站点id
     * @return 考勤打卡记录详情信息
     */
    AttendPunchRecordVO selectById(String attendPunchRecordId, String siteId);

    /**
     * 查询考勤打卡记录
     * @param attendPunchRecordQuery 查询条件
     * @param siteId 所属站点id
     * @return 考勤打卡记录列表信息
     */
    List<AttendPunchRecordListVO> select(AttendPunchRecordQuery attendPunchRecordQuery, String siteId);

    /**
    * 查询考勤打卡记录记录数
    * @param attendPunchRecordQuery 查询条件
    * @param siteId 所属站点id
    * @return 考勤打卡记录记录数
    */
    int selectCount(AttendPunchRecordQuery attendPunchRecordQuery, String siteId);

    /**
     * 分页查询考勤打卡记录
     * @param attendPunchRecordQuery 查询条件
     * @param siteId 所属站点id
     * @return 考勤打卡记录列表信息
     */
    Page<AttendPunchRecordListVO> selectPage(AttendPunchRecordQuery attendPunchRecordQuery, String siteId);


    /**
     * 根据考勤打卡记录id查找
     * @param attendPunchRecordId 考勤打卡记录id
     * @param siteId 所属站点id
     * @return 考勤打卡记录
     */
    AttendPunchRecordDO selectDOById(String attendPunchRecordId, String siteId);

    /**
     * 查询考勤打卡记录
     * @param attendPunchRecordQuery 查询条件
     * @param siteId 所属站点id
     * @return 考勤打卡记录列表
     */
    List<AttendPunchRecordDO> selectDO(AttendPunchRecordQuery attendPunchRecordQuery, String siteId);

    /**
     * 保存Excel导入的考勤记录
     *
     * @param list 导入数据
     * @param tokenUser 当前用户
     * @return 保存结果
     */
    int saveExcelDataList(List<AttendPunchRecordImportDTO> list, TokenUser tokenUser);

    /**
     * 查询上班打卡的记录
     *
     * @param attendPlanId  考勤方案Id
     * @param status        打卡状态
     * @param empInfoId     员工详情Id
     * @param attendDateStr  日期
     * @param siteId         站点Id
     * @return 上班打卡记录
     */
    AttendPunchRecordDO selectOnWorkRecord(String attendPlanId, Integer status, String empInfoId, String attendDateStr, String siteId);

    /**
     * 查询下班打卡的记录
     *
     * @param attendPlanId  考勤方案Id
     * @param status        打卡状态
     * @param empInfoId     员工详情Id
     * @param attendDateStr 日期
     * @param siteId        站点Id
     * @return 下班打卡记录
     */
    AttendPunchRecordDO selectOffWorkRecord(String attendPlanId, Integer status, String empInfoId, String attendDateStr, String siteId);

    /**
     * 查询要导出的考勤打卡记录
     * @param attendPunchRecordQuery 查询条件
     * @param siteId 所属站点id
     * @return 要导出的考勤打卡记录列表
     */
    List<AttendPunchRecordExportVO> selectExportList(AttendPunchRecordQuery attendPunchRecordQuery, String siteId);

    /**
     * 解析要导入的excel并返回解析结果
     * @param file 文件
     * @param success 是否只返回解析成功的，如果false，则只返回失败的，为null全部返回
     * @param tokenUser 当前用户
     * @return 解析结果
     */
    List<ParseResultVO<AttendPunchRecordImportDTO>> parseImportFile(File file, Boolean success, TokenUser tokenUser);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     * @param file excel
     * @param tokenUser 当前用户
     * @param force true忽略错误的行，false有错误中断上传
     * @return 成功的条数
     */
    Integer importFile(File file, TokenUser tokenUser, Boolean force);

    /**
     * 分页查询考勤打卡记录
     * @param tokenUser 当前用户信息
     * @param attendPunchRecordQuery 筛选参数
     * @return 返回结果集
     */
    Page<AttendPunchRecordVO> selectAttendPunchRecord(TokenUser tokenUser, AttendPunchRecordQuery attendPunchRecordQuery);

    /**
     * 分页查询某个员工某月的打卡记录
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    Page<AttendPunchRecordVO> selectAttendMonth(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);

    /**
     * 查询某个员工某年某月的打卡记录
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    List<AttendPunchRecordVO> selectAttendYearMonth(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);


    /**
     * 设置某年某月打卡记录的应打卡天数
     * @param attendPunchRecordVOList 打卡记录List
     * @param year 年
     * @param month 月
     * @param tokenUser 当前用户
     */
    void setShouldDatCount(List<AttendPunchRecordVO> attendPunchRecordVOList,
                           String year, String month, TokenUser tokenUser);


    /**
     * 分页查询某日的考勤
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    Page<AttendPunchRecordVO> selectAttendByDay(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);

    /**
     * 分页查询某日的考勤(根据时间范围查询)
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    Page<AttendPunchRecordVO> selectAttendByTime(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);

    /**
     * 查询某个人某一天的考勤记录
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    List<AttendPunchRecordVO> selectAttendByDayAndEmpId(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);

    /**
     * 导出考勤打卡列表
     * @param tokenUser 当前用户信息
     * @param attendPunchRecordQuery 筛选参数
     * @return 返回结果集
     */
    List<AttendPunchRecordVO> exportAttendPunchRecord(TokenUser tokenUser, AttendPunchRecordQuery attendPunchRecordQuery);

    /**
     * 导出某个员工某月的打卡记录
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    List<AttendPunchRecordVO> exportAttendMonth(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);

    /**
     * 导出某日的考勤
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    List<AttendPunchRecordVO> exportAttendByDay(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);

    /**
     * 导出所选时间段的考勤
     * @param attendPunchRecordQuery 查询参数
     * @param tokenUser 当前用户信息
     * @return 查询结果集
     */
    List<AttendPunchRecordVO> exportAttendByTime(AttendPunchRecordQuery attendPunchRecordQuery, TokenUser tokenUser);


    /**
     * 打卡员工月考勤统计记录
     * @param planIdList   考勤方案Id列表
     * @param yearAndMonth 年和月份
     * @param tokenUser    当前用户
     * @return 考勤打卡员工月统计DTO列表
     */
    Map<String, Integer> getPunchEmpMonthCountDTOList(List<String> planIdList, String yearAndMonth, TokenUser tokenUser);

    /**
     * 构造导出显示的数据
     * @param attendPunchRecordVOList 导出数据
     */
    void showExportTime(List<AttendPunchRecordVO> attendPunchRecordVOList);

    /**
     * 过滤正常的数据
     * @param attendPunchRecordVOList 导出数据
     */
    List<AttendPunchRecordVO> filtration(List<AttendPunchRecordVO> attendPunchRecordVOList);


}


